import pandas as pd
import plotly.express as px
import plotly.graph_objects as go

# 1. 加载数据
df = pd.read_csv('personality_datasert.csv')

# 2. 查看数据基本信息
print("数据集基本信息:")
print(df.info())

print("\n数据集描述性统计:")
print(df.describe())

# 3. 数据清洗和转换
# 将 'Stage_fear' 和 'Drained_after_socializing' 列转换为布尔类型
df['Stage_fear'] = df['Stage_fear'].map({'Yes': True, 'No': False})
df['Drained_after_socializing'] = df['Drained_after_socializing'].map({'Yes': True, 'No': False})

# 将英文性格类型转换为中文
personality_mapping = {'Introvert': '内向', 'Extrovert': '外向'}
df['Personality'] = df['Personality'].map(personality_mapping)

# 将 'Personality' 列转换为分类类型
df['Personality'] = df['Personality'].astype('category')

# 处理缺失值（如果有）
# 在这个数据集中没有缺失值，如果有的话可以使用以下方法处理：
# df = df.dropna()  # 删除缺失值
# 或者
# df = df.fillna(df.mean())  # 用均值填充数值列缺失值

# 转换数据类型
for col in df.columns:
    if df[col].dtype == 'object':
        try:
            df[col] = df[col].astype(float)
        except:
            pass

# 4. 数据分析
# 计算每个个性类型的平均值
personality_means = df.groupby('Personality').mean()

# 5. 保存清洗后的数据
df.to_csv('cleaned_personality_data.csv', index=False)

# 6. 可视化
# 使用 Plotly 创建交互式图表

# 图表1：个性类型分布
fig1 = px.histogram(df, x='Personality', title='个性类型分布')
fig1.update_layout(xaxis_title='个性类型', yaxis_title='人数')

# 图表2：个性类型与独处时间的关系
fig2 = px.box(df, x='Personality', y='Time_spent_Alone', title='个性类型与独处时间的关系')
fig2.update_layout(xaxis_title='个性类型', yaxis_title='独处时间')

# 图表3：社交活动参与度与个性类型的散点图
fig3 = px.scatter(df, x='Social_event_attendance', y='Going_outside', color='Personality',
                 title='社交活动参与度与外出频率的关系')
fig3.update_layout(xaxis_title='社交活动参与度', yaxis_title='外出频率')

# 图表4：个性类型各特征平均值的雷达图
fig4 = go.Figure()
categories = personality_means.columns.tolist()
extrovert_values = personality_means.loc['外向'].values.tolist()
introvert_values = personality_means.loc['内向'].values.tolist()

fig4.add_trace(go.Scatterpolar(
    r=extrovert_values,
    theta=categories,
    fill='toself',
    name='外向型'
))

fig4.add_trace(go.Scatterpolar(
    r=introvert_values,
    theta=categories,
    fill='toself',
    name='内向型'
))

fig4.update_layout(
    polar=dict(
        radialaxis=dict(
            visible=True,
            range=[0, 10]
        )),
    title='个性类型各特征平均值对比'
)

# 显示图表
fig1.show()
fig2.show()
fig3.show()
fig4.show()

# 7. 打印清洗后的数据信息
print("\n清洗后的数据集基本信息:")
print(pd.read_csv('cleaned_personality_data.csv').info())